const poolPromise = require('../pools.js');
const sql = require('mssql'); // 导入 mssql 模块

/**
 * 执行通用数据库查询并返回结果
 * @param {string} sqlStatement - SQL 查询语句
 * @returns {Promise<Object>} - 包含查询结果的 Promise 对象
 */
const executeQuery = async (sqlStatement) => {
    const pool = await poolPromise;
    const request = pool.request();
    
    try {
        const result = await request.query(sqlStatement);
        return {
			rows: result.recordset
		}
    } catch (error) {
        throw error; // 抛出错误以便调用者处理
    } finally {
        // 在 mssql 库中，通常不需要手动调用 request.close() 来关闭请求，因为 mssql 的连接池会自动管理连接的生命周期。一旦请求完成，无论是成功还是失败，连接都会自动返回到连接池中，准备被其他请求重用
    }
};

/**
 * 执行通用分页数据库查询并返回结果
 * @param {string} sqlStatement - SQL 查询语句
 * @param {number} qpageSize - 每页数量
 * @param {number} qpageNo - 当前页码
 * @param {string} qsortName - 排序字段名
 * @returns {Promise<Object>} - 包含分页结果的 Promise 对象
 */
const executePagedQuery = async (sqlStatement, qpageSize, qpageNo, qsortName) => {
	const pool = await poolPromise;

	const pageSize = parseInt(qpageSize) || 10;
	const pageNo = parseInt(qpageNo) || 1;
	const sortName = qsortName || 'create_time';
	if(!sqlStatement) throw new Error(`SQL语句不能为空`)

	// 计算总记录数的查询
	const countSql = `SELECT COUNT(*) AS total FROM (${sqlStatement}) AS tmp`;
	const offset = (pageNo - 1) * pageSize;
	// 准备参数化查询
	const pageSql = `SELECT * FROM (${sqlStatement}) AS pagedResult
					ORDER BY ${sortName} OFFSET ${offset} ROWS  
					FETCH NEXT ${pageSize} ROWS ONLY`;
	try {
		// 获取总记录数
		const countResult = await pool.request().query(countSql);
		const totalRows = countResult.recordset[0].total;

		// 计算总页数
		const totalPages = Math.ceil(totalRows / pageSize);

		// 设置参数
		const request = pool.request();

		// 执行分页查询
		const pageResult = await request.query(pageSql);
		const pageData = pageResult.recordset;

		return {
			rows: pageData,
			totalRows,
			totalPages,
			pageNo,
			pageSize
		};
	} catch (error) {
		throw error; // 抛出错误以便调用者处理
	} finally {
	
	}
};

module.exports = { executeQuery, executePagedQuery };